package mx.ipn.persistencia.mysql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import mx.ipn.persistencia.FabricaDeDAOs;
import mx.ipn.persistencia.dao.ClienteDAO;
import mx.ipn.persistencia.dao.ClienteDireccionDAO;
import mx.ipn.persistencia.dao.DireccionDAO;
import mx.ipn.to.ClienteDireccionTO;
import mx.ipn.to.ClienteTO;
import mx.ipn.to.DireccionTO;

public class ClienteDireccionDAOMySQL implements ClienteDireccionDAO {
	static{FabricaDeDAOsMySQL.iniciaLog(ClienteDireccionDAOMySQL.class);}

	private static final String INSERT = "INSERT INTO cliente_direccion (id_cliente,id_direccion,activo,frecuencia) VALUES(?,?,?,?)";
	private static final String ACTIVADESACTIVA = "UPDATE cliente_direccion SET activo=? WHERE id_cliente_direccion=?";
	private static final String UPDATE = "UPDATE cliente_direccion SET id_cliente=?,id_direccion=?,activo=?,frecuencia=? WHERE id_cliente_direccion=?";
	
	private static final String FINDBYID = "SELECT * FROM cliente_direccion WHERE id_cliente_direccion=?";
	private static final String FINDBYIDCLIENTEIDDIRECCION = "SELECT * FROM cliente_direccion WHERE id_cliente=? and id_direccion=?";
	
	private static final String SELECT = "SELECT * FROM cliente_direccion";
	private static final String SELECTACTIVO = "SELECT * FROM cliente_direccion where activo=true";
	
	private static final String SELECTACTIVOBYCLIENTE = "SELECT * FROM cliente_direccion WHERE activo=true and id_cliente=?";
	private static final String SELECTACTIVOBYDIRECCION = "SELECT * FROM cliente_direccion WHERE activo=true and id_direccion=?";
	private static final String SELECTBYCLIENTE = "SELECT * FROM cliente_direccion WHERE id_cliente=?";
	private static final String SELECTBYDIRECCION = "SELECT * FROM cliente_direccion WHERE id_direccion=?";

	@Override
	public short ActivaDesactivaClienteDireccion(int idClienteDireccion,
			boolean activa) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(ACTIVADESACTIVA);

			ps.setBoolean(1, activa);
			ps.setInt(2, idClienteDireccion);

			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			}

			else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}

	@Override
	public ClienteDireccionTO findClienteDireccionById(int idClienteDireccion) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(FINDBYID);

			ps.setInt(1, idClienteDireccion);

			ResultSet rs = ps.executeQuery();

			if (rs.next()) {

				boolean activo = rs.getBoolean("activo");
				int idCliente = rs.getInt("id_cliente");
				int idDireccion = rs.getInt("id_direccion");
				int frecuencia = rs.getInt("frecuencia");
				
				FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
						.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
				
				ClienteDAO clienteDAO = fabricaMySQL.getClienteDAO();
				DireccionDAO direccionDAO = fabricaMySQL.getDireccionDAO();

				ArrayList<DireccionTO> direccionTO = new ArrayList<DireccionTO>();
				ArrayList<ClienteTO> clienteTO = new ArrayList<ClienteTO>();

				direccionTO.add(direccionDAO.findDireccionById(idDireccion));
				clienteTO.add(clienteDAO.findClienteById(idCliente));

				DireccionTO[] arrDireccion = (DireccionTO[])direccionTO.toArray(new DireccionTO[direccionTO.size()]);
				ClienteTO[] arrCliente = (ClienteTO[])clienteTO.toArray(new ClienteTO[clienteTO.size()]);
				
				ClienteDireccionTO clienteDireccionTO = new ClienteDireccionTO(
						idClienteDireccion, arrCliente, arrDireccion, activo,frecuencia);

				ps.close();
				conexion.close();
				return clienteDireccionTO;
			}

			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ClienteDireccionTO findClienteDireccionByIdClienteIdDireccion(
			int idCliente, int idDireccion) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion
					.prepareStatement(FINDBYIDCLIENTEIDDIRECCION);

			ps.setInt(1, idCliente);
			ps.setInt(2, idDireccion);
			

			ResultSet rs = ps.executeQuery();

			if (rs.next()) {
				int idClienteDireccion = rs.getInt("id_cliente_direccion");
				boolean activo = rs.getBoolean("activo");
				int frecuencia = rs.getInt("frecuencia");
				
				FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
						.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
				
				ClienteDAO clienteDAO = fabricaMySQL.getClienteDAO();
				DireccionDAO direccionDAO = fabricaMySQL.getDireccionDAO();

				ArrayList<DireccionTO> direccionTO = new ArrayList<DireccionTO>();
				ArrayList<ClienteTO> clienteTO = new ArrayList<ClienteTO>();

				direccionTO.add(direccionDAO.findDireccionById(idDireccion));
				clienteTO.add(clienteDAO.findClienteById(idCliente));

				DireccionTO[] arrDireccion = (DireccionTO[])direccionTO.toArray(new DireccionTO[direccionTO.size()]);
				ClienteTO[] arrCliente = (ClienteTO[])clienteTO.toArray(new ClienteTO[clienteTO.size()]);
				
				ClienteDireccionTO clienteDireccionTO = new ClienteDireccionTO(
						idClienteDireccion, arrCliente, arrDireccion, activo,frecuencia);

				ps.close();
				conexion.close();
				return clienteDireccionTO;
			}

			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public boolean insertClienteDireccion(ClienteDireccionTO clienteDireccionTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(INSERT);

			ps.setInt(1, clienteDireccionTO.getIdCliente());
			ps.setInt(2, clienteDireccionTO.getIdDireccion());
			ps.setBoolean(3, clienteDireccionTO.getActivo());
			ps.setInt(4, clienteDireccionTO.getFrecuencia());
			ps.executeUpdate();
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	@Override
	public ArrayList<ClienteDireccionTO> selectClienteDireccion() {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
		
			FabricaDeDAOs fabricaMySQL = null;
		
			ClienteDAO clienteDAO = null;
			DireccionDAO direccionDAO = null;

			ArrayList<ClienteDireccionTO> clienteDireccionTO = null;
			ClienteDireccionTO clienteDireccionTO2 = null;
			ArrayList<ClienteTO> clienteTO = null;
			ArrayList<DireccionTO> direccionTO = null;

			PreparedStatement ps = conexion.prepareStatement(SELECT);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (clienteDireccionTO == null) {
					clienteDireccionTO = new ArrayList<ClienteDireccionTO>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					clienteDAO = fabricaMySQL.getClienteDAO();
					direccionDAO = fabricaMySQL.getDireccionDAO();
				}

				clienteTO = new ArrayList<ClienteTO>();
				direccionTO = new ArrayList<DireccionTO>();
				clienteDireccionTO2 = new ClienteDireccionTO();
				int idClienteDireccion = rs.getInt("id_cliente_direccion");
				clienteTO.add(clienteDAO.findClienteById(rs
						.getInt("id_cliente")));
				direccionTO.add(direccionDAO.findDireccionById(rs
						.getInt("id_direccion")));
				boolean activo = rs.getBoolean("activo");
				int frecuencia = rs.getInt("frecuencia");

				ClienteTO[] arrCliente = (ClienteTO[])clienteTO.toArray(new ClienteTO[clienteTO.size()]);
				DireccionTO[] arrDireccion = (DireccionTO[])direccionTO.toArray(new DireccionTO[direccionTO.size()]);
				
				clienteDireccionTO2 = new ClienteDireccionTO(
						idClienteDireccion, arrCliente, arrDireccion, activo,frecuencia);

				clienteDireccionTO.add(clienteDireccionTO2);
			}
			ps.close();
			conexion.close();
			return clienteDireccionTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ArrayList<ClienteDireccionTO> selectClienteDireccionActivo() {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			
			FabricaDeDAOs fabricaMySQL = null;
			
			ClienteDAO clienteDAO = null;
			DireccionDAO direccionDAO = null;

			ArrayList<ClienteDireccionTO> clienteDireccionTO = null;
			ClienteDireccionTO clienteDireccionTO2 = null;
			ArrayList<ClienteTO> clienteTO = null;
			ArrayList<DireccionTO> direccionTO = null;

			PreparedStatement ps = conexion.prepareStatement(SELECTACTIVO);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (clienteDireccionTO == null) {
					clienteDireccionTO = new ArrayList<ClienteDireccionTO>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					clienteDAO = fabricaMySQL.getClienteDAO();
					direccionDAO = fabricaMySQL.getDireccionDAO();
				}

				clienteTO = new ArrayList<ClienteTO>();
				direccionTO = new ArrayList<DireccionTO>();
				clienteDireccionTO2 = new ClienteDireccionTO();
				int idClienteDireccion = rs.getInt("id_cliente_direccion");
				clienteTO.add(clienteDAO.findClienteById(rs
						.getInt("id_cliente")));
				direccionTO.add(direccionDAO.findDireccionById(rs
						.getInt("id_direccion")));
				boolean activo = rs.getBoolean("activo");
				int frecuencia = rs.getInt("frecuencia");

				DireccionTO[] arrDireccion = (DireccionTO[])direccionTO.toArray(new DireccionTO[direccionTO.size()]);
				ClienteTO[] arrCliente = (ClienteTO[])clienteTO.toArray(new ClienteTO[clienteTO.size()]);
				
				clienteDireccionTO2 = new ClienteDireccionTO(
						idClienteDireccion, arrCliente, arrDireccion, activo,frecuencia);

				clienteDireccionTO.add(clienteDireccionTO2);
			}
			ps.close();
			conexion.close();
			return clienteDireccionTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ClienteDireccionTO selectClienteDireccionActivoByCliente(
			int idCliente) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			// Crea la fabrica especifica de MySQL
			FabricaDeDAOs fabricaMySQL = null;
			// Crea un DAO para la tabla Cliente
			ClienteDAO clienteDAO = null;
			DireccionDAO direccionDAO = null;

			ClienteDireccionTO clienteDireccionTO = null;
			ArrayList<ClienteTO> clienteTO = null;
			ArrayList<Integer> listIdClienteDireccion = null;
			ArrayList<DireccionTO> direccionTO = null;
			ArrayList<Boolean> listActivo = null;
			ArrayList<Integer> listFrecuencia = null;
			PreparedStatement ps = conexion
					.prepareStatement(SELECTACTIVOBYCLIENTE);

			ps.setInt(1, idCliente);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdClienteDireccion == null) {
					clienteTO = new ArrayList<ClienteTO>();
					listIdClienteDireccion = new ArrayList<Integer>();
					direccionTO = new ArrayList<DireccionTO>();
					listActivo = new ArrayList<Boolean>();
					listFrecuencia = new ArrayList<Integer>();
					
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					clienteDAO = fabricaMySQL.getClienteDAO();
					direccionDAO = fabricaMySQL.getDireccionDAO();
				}

				listIdClienteDireccion.add(rs.getInt("id_cliente_direccion"));
				direccionTO.add(direccionDAO.findDireccionById(rs
						.getInt("id_direccion")));
				listActivo.add(true);
				listFrecuencia.add(rs.getInt("frecuencia"));
				
			}
			if (listIdClienteDireccion != null) {
				clienteTO.add(clienteDAO.findClienteById(idCliente));
				
				DireccionTO[] arrDireccion = (DireccionTO[])direccionTO.toArray(new DireccionTO[direccionTO.size()]);
				ClienteTO[] arrCliente = (ClienteTO[])clienteTO.toArray(new ClienteTO[clienteTO.size()]);
				
				Integer[] arrIdClienteDireccion = (Integer[])listIdClienteDireccion.toArray(new Integer[listIdClienteDireccion.size()]);
				Boolean[] arrActivo = (Boolean[])listActivo.toArray(new Boolean[listActivo.size()]);
				Integer[] arrFrecuencia = (Integer[])listFrecuencia.toArray(new Integer[listFrecuencia.size()]);
				
				clienteDireccionTO = new ClienteDireccionTO(
						arrIdClienteDireccion, arrCliente, arrDireccion,
						arrActivo,arrFrecuencia);
			}

			ps.close();
			conexion.close();
			return clienteDireccionTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ClienteDireccionTO selectClienteDireccionActivoByDireccion(
			int idDireccion) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			
			FabricaDeDAOs fabricaMySQL = null;
			
			ClienteDAO clienteDAO = null;
			DireccionDAO direccionDAO = null;

			ClienteDireccionTO clienteDireccionTO = null;
			ArrayList<ClienteTO> clienteTO = null;
			ArrayList<Integer> listIdClienteDireccion = null;
			ArrayList<DireccionTO> direccionTO = null;
			ArrayList<Boolean> listActivo = null;

			ArrayList<Integer> listFrecuencia = null;
			PreparedStatement ps = conexion
					.prepareStatement(SELECTACTIVOBYDIRECCION);

			ps.setInt(1, idDireccion);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdClienteDireccion == null) {
					clienteTO = new ArrayList<ClienteTO>();
					listIdClienteDireccion = new ArrayList<Integer>();
					direccionTO = new ArrayList<DireccionTO>();
					listActivo = new ArrayList<Boolean>();
					listFrecuencia = new ArrayList<Integer>();
					
					
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					clienteDAO = fabricaMySQL.getClienteDAO();
					direccionDAO = fabricaMySQL.getDireccionDAO();
				}

				listIdClienteDireccion.add(rs.getInt("id_cliente_direccion"));
				clienteTO.add(clienteDAO.findClienteById(rs
						.getInt("id_cliente")));
				listActivo.add(true);
				listFrecuencia.add(rs.getInt("frecuencia"));
				
			}
			if (listIdClienteDireccion != null) {
				direccionTO.add(direccionDAO.findDireccionById(idDireccion));
				
				DireccionTO[] arrDireccion = (DireccionTO[])direccionTO.toArray(new DireccionTO[direccionTO.size()]);
				ClienteTO[] arrCliente = (ClienteTO[])clienteTO.toArray(new ClienteTO[clienteTO.size()]);
				
				Integer[] arrIdClienteDireccion = (Integer[])listIdClienteDireccion.toArray(new Integer[listIdClienteDireccion.size()]);
				Boolean[] arrActivo = (Boolean[])listActivo.toArray(new Boolean[listActivo.size()]);
				Integer[] arrFrecuencia = (Integer[])listFrecuencia.toArray(new Integer[listFrecuencia.size()]);
				
				clienteDireccionTO = new ClienteDireccionTO(
						arrIdClienteDireccion, arrCliente, arrDireccion,
						arrActivo,arrFrecuencia);
			}

			ps.close();
			conexion.close();
			return clienteDireccionTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ClienteDireccionTO selectClienteDireccionByCliente(int idCliente) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			
			FabricaDeDAOs fabricaMySQL = null;
			
			ClienteDAO clienteDAO = null;
			DireccionDAO direccionDAO = null;

			ClienteDireccionTO clienteDireccionTO = null;
			ArrayList<ClienteTO> clienteTO = null;
			ArrayList<Integer> listIdClienteDireccion = null;
			ArrayList<DireccionTO> direccionTO = null;
			ArrayList<Boolean> listActivo = null;

			ArrayList<Integer> listFrecuencia = null;
			
			PreparedStatement ps = conexion.prepareStatement(SELECTBYCLIENTE);

			ps.setInt(1, idCliente);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdClienteDireccion == null) {
					clienteTO = new ArrayList<ClienteTO>();
					listIdClienteDireccion = new ArrayList<Integer>();
					direccionTO = new ArrayList<DireccionTO>();
					listActivo = new ArrayList<Boolean>();
					
					listFrecuencia = new ArrayList<Integer>();
					
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					clienteDAO = fabricaMySQL.getClienteDAO();
					direccionDAO = fabricaMySQL.getDireccionDAO();
				}

				listIdClienteDireccion.add(rs.getInt("id_cliente_direccion"));
				direccionTO.add(direccionDAO.findDireccionById(rs
						.getInt("id_direccion")));
				listActivo.add(rs.getBoolean("activo"));
				
				listFrecuencia.add(rs.getInt("frecuencia"));
				
			}
			if (listIdClienteDireccion != null) {
				clienteTO.add(clienteDAO.findClienteById(idCliente));
				
				DireccionTO[] arrDireccion = (DireccionTO[])direccionTO.toArray(new DireccionTO[direccionTO.size()]);
				ClienteTO[] arrCliente = (ClienteTO[])clienteTO.toArray(new ClienteTO[clienteTO.size()]);
				
				Integer[] arrIdClienteDireccion = (Integer[])listIdClienteDireccion.toArray(new Integer[listIdClienteDireccion.size()]);
				Boolean[] arrActivo = (Boolean[])listActivo.toArray(new Boolean[listActivo.size()]);
				Integer[] arrFrecuencia = (Integer[])listFrecuencia.toArray(new Integer[listFrecuencia.size()]);
				
				clienteDireccionTO = new ClienteDireccionTO(
						arrIdClienteDireccion, arrCliente, arrDireccion,
						arrActivo,arrFrecuencia);
			}

			ps.close();
			conexion.close();
			return clienteDireccionTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ClienteDireccionTO selectClienteDireccionByDireccion(int idDireccion) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			
			FabricaDeDAOs fabricaMySQL = null;
	
			ClienteDAO clienteDAO = null;
			DireccionDAO direccionDAO = null;

			ClienteDireccionTO clienteDireccionTO = null;
			ArrayList<ClienteTO> clienteTO = null;
			ArrayList<Integer> listIdClienteDireccion = null;
			ArrayList<DireccionTO> direccionTO = null;
			ArrayList<Boolean> listActivo = null;
			ArrayList<Integer> listFrecuencia = null;
			
			PreparedStatement ps = conexion.prepareStatement(SELECTBYDIRECCION);

			ps.setInt(1, idDireccion);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdClienteDireccion == null) {
					clienteTO = new ArrayList<ClienteTO>();
					listIdClienteDireccion = new ArrayList<Integer>();
					direccionTO = new ArrayList<DireccionTO>();
					listActivo = new ArrayList<Boolean>();
					listFrecuencia = new ArrayList<Integer>();
					
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					clienteDAO = fabricaMySQL.getClienteDAO();
					direccionDAO = fabricaMySQL.getDireccionDAO();
				}

				listIdClienteDireccion.add(rs.getInt("id_cliente_direccion"));
				clienteTO.add(clienteDAO.findClienteById(rs
						.getInt("id_cliente")));
				listActivo.add(rs.getBoolean("activo"));
				listFrecuencia.add(rs.getInt("frecuencia"));
			}
			if (listIdClienteDireccion != null) {
				direccionTO.add(direccionDAO.findDireccionById(idDireccion));
				
				DireccionTO[] arrDireccion = (DireccionTO[])direccionTO.toArray(new DireccionTO[direccionTO.size()]);
				ClienteTO[] arrCliente = (ClienteTO[])clienteTO.toArray(new ClienteTO[clienteTO.size()]);
				
				Integer[] arrIdClienteDireccion = (Integer[])listIdClienteDireccion.toArray(new Integer[listIdClienteDireccion.size()]);
				Boolean[] arrActivo = (Boolean[])listActivo.toArray(new Boolean[listActivo.size()]);
				Integer[] arrFrecuencia = (Integer[])listFrecuencia.toArray(new Integer[listFrecuencia.size()]);
				
				clienteDireccionTO = new ClienteDireccionTO(
						arrIdClienteDireccion, arrCliente, arrDireccion,
						arrActivo,arrFrecuencia);
			}

			ps.close();
			conexion.close();
			return clienteDireccionTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public short updateClienteDireccion(ClienteDireccionTO clienteDireccionTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(UPDATE);

			ps.setInt(1, clienteDireccionTO.getIdCliente());
			ps.setInt(2, clienteDireccionTO.getIdDireccion());
			ps.setBoolean(3, clienteDireccionTO.getActivo());
			ps.setInt(4, clienteDireccionTO.getFrecuencia());
			ps.setInt(5, clienteDireccionTO.getIdClienteDireccion());

			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			}

			else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}

}
